package com.ying.myrabbitmq.config;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

@Configuration
public class MyRabbitMqConfig {

    @Autowired
    RabbitTemplate rabbitTemplate;

    /**
     * 自定义的json数据转换
     */
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    /**
     * 定制RabbitMqTemplate
     */

    @PostConstruct
    public void initRabbitMqTemplate() {

        //消息投递到服务器的回调
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             *
             * @param correlationData   消息id
             * @param ack               消息是否接收
             * @param cause             可选的原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {

                System.out.println("消息id--->" + correlationData);
                System.out.println("消息是否成功接收--->" + ack);
                System.out.println("失败的原因--->" + cause);

            }
        });


        //消息投递到队列的回调,失败才会调用
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            /**
             * @param message       投递失败的消息内容
             * @param replyCode     回复状态码
             * @param replyText     回复的文本内容
             * @param exchange      当时这个消息发送的交换机
             * @param routingKey    当时消息使用的路由键
             */
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {

                System.out.println("投递失败的消息内容--->" + message);
                System.out.println("回复状态码--->" + replyCode);
                System.out.println("回复的文本内容--->" + replyText);
                System.out.println("当时这个消息发送的交换机--->" + exchange);
                System.out.println("当时消息使用的路由键--->" + routingKey);

            }
        });
    }
}
